/**
 * 专门修复 wxusers phone 索引问题的脚本
 * 解决 E11000 duplicate key error 问题
 */

const mongoose = require('mongoose');
require('dotenv').config();

async function fixPhoneIndex() {
  try {
    console.log('🔧 开始修复 wxusers phone 索引问题...\n');
    
    // 连接 MongoDB - 使用线上数据库
    const mongoUri = 'mongodb+srv://1191665779:20020219aa@zn.apmsejq.mongodb.net/medical_digital_twin';
    console.log(`连接数据库: ${mongoUri}`);
    await mongoose.connect(mongoUri);
    console.log('✅ 数据库连接成功\n');

    const db = mongoose.connection.db;
    const col = db.collection('wxusers');

    // 1) 检查当前数据状态
    console.log('📊 当前数据状态检查:');
    const totalUsers = await col.countDocuments();
    const nullPhoneUsers = await col.countDocuments({ phone: null });
    const emptyPhoneUsers = await col.countDocuments({ phone: '' });
    const validPhoneUsers = await col.countDocuments({ phone: { $exists: true, $ne: null, $ne: '' } });
    
    console.log(`- 总用户数: ${totalUsers}`);
    console.log(`- phone=null 的用户: ${nullPhoneUsers}`);
    console.log(`- phone='' 的用户: ${emptyPhoneUsers}`);
    console.log(`- 有效手机号用户: ${validPhoneUsers}\n`);

    // 2) 清理数据中的 null/空串手机号
    console.log('🧹 清理数据:');
    const cleanRes1 = await col.updateMany({ phone: null }, { $unset: { phone: 1 } });
    const cleanRes2 = await col.updateMany({ phone: '' }, { $unset: { phone: 1 } });
    const cleanRes3 = await col.updateMany({ phone: { $exists: false } }, { $set: {} }); // 确保没有遗留问题
    console.log(`- 清理 phone=null: ${cleanRes1.modifiedCount} 条记录`);
    console.log(`- 清理 phone='': ${cleanRes2.modifiedCount} 条记录`);
    console.log(`- 检查不存在phone字段: ${cleanRes3.matchedCount} 条记录\n`);

    // 3) 检查集合是否存在，如果不存在就初始化
    console.log('🗂️ 索引管理:');
    const collections = await db.listCollections({ name: 'wxusers' }).toArray();
    
    if (collections.length === 0) {
      console.log('- ℹ️ wxusers 集合不存在，将创建集合并初始化索引');
      
      // 创建集合（插入一个临时文档再删除，这样可以触发集合创建）
      await col.insertOne({ temp: true });
      await col.deleteOne({ temp: true });
      console.log('- ✅ 已创建 wxusers 集合');
    } else {
      console.log('- ℹ️ wxusers 集合已存在');
      
      // 检查现有索引
      try {
        const indexes = await col.indexes();
        console.log('- 当前索引:', indexes.map(i => i.name));
        
        const phoneIndex = indexes.find(i => i.name === 'phone_1');
        if (phoneIndex) {
          try {
            await col.dropIndex('phone_1');
            console.log('- ✅ 已删除旧的 phone_1 索引');
          } catch (e) {
            console.log('- ⚠️ 删除旧索引失败，忽略');
          }
        }
      } catch (e) {
        console.log('- ⚠️ 检查索引时出错，可能是集合为空');
      }
    }

    // 4) 创建正确的部分唯一索引
    try {
      await col.createIndex(
        { phone: 1 },
        { 
          unique: true, 
          partialFilterExpression: { phone: { $exists: true } },
          name: 'phone_partial_unique'
        }
      );
      console.log('- ✅ 已创建 phone 部分唯一索引');
    } catch (e) {
      if (e.message.includes('already exists')) {
        console.log('- ℹ️ phone 部分唯一索引已存在');
      } else {
        throw e;
      }
    }

    // 5) 创建其他必要索引
    try {
      await col.createIndex({ id: 1 }, { unique: true, name: 'id_unique' });
      console.log('- ✅ 已创建 id 唯一索引');
    } catch (e) {
      if (e.message.includes('already exists')) {
        console.log('- ℹ️ id 唯一索引已存在');
      } else {
        console.log('- ⚠️ 创建 id 索引失败:', e.message);
      }
    }

    try {
      await col.createIndex({ wechatOpenId: 1 }, { sparse: true, name: 'wechatOpenId_sparse' });
      console.log('- ✅ 已创建 wechatOpenId 稀疏索引');
    } catch (e) {
      if (e.message.includes('already exists')) {
        console.log('- ℹ️ wechatOpenId 稀疏索引已存在');
      } else {
        console.log('- ⚠️ 创建 wechatOpenId 索引失败:', e.message);
      }
    }
    console.log();

    // 5) 验证修复结果
    console.log('🔍 修复后验证:');
    const finalIndexes = await col.indexes();
    const newPhoneIndex = finalIndexes.find(i => i.name === 'phone_partial_unique');
    
    if (newPhoneIndex) {
      console.log('- ✅ 新索引创建成功');
      console.log('- 索引配置:', JSON.stringify(newPhoneIndex, null, 2));
    }

    const finalNullPhoneUsers = await col.countDocuments({ phone: { $exists: false } });
    console.log(`- 修复后无 phone 字段的用户: ${finalNullPhoneUsers} 条\n`);

    console.log('🎉 修复完成！现在可以正常进行微信登录了。');
    
  } catch (error) {
    console.error('❌ 修复过程中出错:', error);
    throw error;
  } finally {
    await mongoose.disconnect();
    console.log('数据库连接已关闭');
  }
}

// 运行修复
fixPhoneIndex()
  .then(() => {
    console.log('\n✅ 所有操作完成');
    process.exit(0);
  })
  .catch((error) => {
    console.error('\n❌ 修复失败:', error);
    process.exit(1);
  });